import axios from 'axios'
import store from '@/store/'
import router from '@/router'

const service = axios.create({
// axios请求的完整地址：baseURL+url
// 不能让axios直接去请求http开头的外链地址
// 而是要请求/开头还得命中本地开发服务器里代理规则
// axios/script标签scr/img标签的src/link的href都会发起一次请求
// 如果是./开头的地址，找当前文件夹
// 如果是http开头的地址，找到外链外部服务器
// 如果是/开头的地址，忽略文件夹，直接找当前运行时所在的服务器
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

service.interceptors.request.use(
  config => {
    // 在请求拦截器中带上token
    const token = store.getters.token
    if (token) {
      // 拼接token
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
// 1.http状态码为2xx，3xx，就会给promise对象位置，返回成功的结果(resolve())
// 2.http状态码为4xx，5xx，就会给promise对象位置，返回错误的结果(reject())
// 如果想做一些操作，可以用axios响应拦截器
service.interceptors.response.use(
  response => {
    // return response
    const res = response.data
    if (res.success === false) { // 失败
      return Promise.reject(new Error(res.message)) // 错误抛出
    } else { // 成功
      // 如果在拦截器中加.data，则会直接返回data数据(事件处理中不必写外层data)
      return response.data
    }
  },
  error => {
    // 处理身份过期的问题(被动退出)
    if (error.response.data.code === 10002) {
      store.commit('user/RESET_STATE')
      store.commit('user/REMOVE_TOKEN')
      // 处理登陆未遂的问题=
      // router.currentRoute是路由对象内置的，可以拿到当前页面的路由信息对象
      // console.log(router.currentRoute.fullPath)
      // encodeURIComponent是js内置的方法可以把&后的部分转为url编码
      router.replace(`/login?redirect=${encodeURIComponent(router.currentRoute.fullPath)}`)
    }
    return Promise.reject(error)
  }
)

export default service
